keras 소스분석 - predict.py 발표용

2017 12 25일 월요일

오전 1:51

링크: https://deeplearningsandbox.com/how-to-use-transfer-learning-and-fine-tuning-in-keras-and-tensorflow-to-build-an-image-recognition-94b0b02444f2

소스: git clone https://github.com/DeepLearningSandbox/DeepLearningSandbox

 

소스 코드 분석

1) 학습된 .model 파일을 가져다가

2) 입력 이미지에 대한 예측을 하게 하는 소스이다.

 

 

if name 
maln 
a— argparse. Argumentparser() 
a. add _ argument(" - -image", to, image") 
a. add _ argument(" - -image_url", help="url to, image") 
a. add _ argument(" - -model " ) 
args 
if args . image 
is None and args . image_url is ONone: 
sys. exit(l) 
model 
= load_model (args. model) 
if args . image is not None: 
img = Image. open(args.image) 
preds = predict(model, img, target _ size) 
plot_preds(img, preds) 
if, args . image_url is not INone: 
response = requests. get(args. image_url) 
img = Image. open (Byteslo(response.content)) 
preds = predict(model, img, target _ size) 
plot_preds(img, preds)

 

1) 이미지의 경로나 url 을 파라미터로 받고

2) 사용할 model 파일명을 파라미터로 받는다

 

- 이미지 경로와 url 둘 다 없으면 에러처리하고 나간다

 

1) load_model() 함수로 모델을 로딩한다음

2) 이미지를 열고, 예측한다

3) matplotlib 을 이용해서 예측 결과를 그려준다

 

 

def predict(model, img, target _ size): 
"""Run model prediction on image 
Args : 
model: keras model 
img: PIL format image 
target_size: (w, h) tuple 
Returns : 
list of predicted labels and their probabilities 
if, img.size target_size: 
img = img. resize(target_size) 
x— image. img_to_array(img) 
x = np.expand_dims(x, axis=e) 
x = preprocess_input(x) 
preds = model. predict(x) 
return preds[e]

 

실제로 예측하는 함수

 

1) 인셉션 v3 모델은 입력 해상도가 229x229 이다.

- img.resize() 함수를 통해 변경해줌

2) train 시에는 generator 함수가 알아서 해주던  전처리를 해준다

- 이미지를 배열로 바꿔주고

- 배열의 차원을 변경해주고

- 전처리를 해준다음

- model.predict 를 해준다. 아마도 최종 output을 내보내줄듯

3) 그 결과를 리턴

- def plot_preds(image, preds): 
"Displays image and the, top-rl predicted probabilities in, a bar, graph 
Args : 
image: PIL image 
preds: list of, predicted labels and their probabilities 
plt. imshow(image) 
plt.axis( 'off') 
plt. figure() 
labels — 
— ("cat", "dog") 
preds, alpha—e. 5) 
1], labels) 
plt. xlabel( Probability ' ) 
plt. el) 
plt. 
plt. show()

 

이건 그려주는 부분

 

Google Compute Engine 에서 Jupyter notebook 써보자

 

- VM에서 GUI 환경이나 브라우저를 띄우는건 어떻게 하지?

- 그게 안되니 그냥 실행하면 matplotlib 쓰는 부분에서 동작안한다

- Jupyter notebook을 쓰면 바로 볼 수는 있겠다.

- pip3 install jupyter 로 설치하고

- jupyter notebook 으로 실행

 

 

삽질 모음

 

jupyter notebook 이라고 실행하면

No web browser found: could not locate runnable browser.

Copy/paste this URL into your browser when you connect for the first time,

to login with a token: http://localhost:8888/?token=7f5f486c90f3d9d938dd39da283f41b730c3906222f9d07b

 

위와 같이 나왔고, url 클릭하니

Error: No active Cloud Shell.

You are currently logged in as hyunseokjeong1@gmail.com which does not have an active Cloud Shell. Please start a Cloud Shell session, then click the Web Preview button then select the port number from the displayed menu to preview your application.

 

위 시키는데로 클라우드 셀로 하려해도 포트가 8888은 없음

 

GCP VPC network Firewall rues 에서 tcp:8080, udp:8080 룰을 만들고 VM에 적용해봄

- 그래도 안됨

 

 

 

해법

 

참고 링크: https://jeffdelaney.me/blog/running-jupyter-notebook-google-cloud-platform/

 

1. External IP static 이어야 한다. 아래와 같이 변경

Google Cloud Platform 
VPC network 
VPC networks 
External IP addresses 
yapKaggle 
External IP addresses 
RESERVE STATIC ADDRESS 
C REFRESH 
In use by 
i RELEASE STATIC ADDRESS 
Labels 
Name 
jupyter 
External Address 
Region 
us-west 1 
Type v 
Static 
Version 
VM instance instance-2 (Zone b) 
Change

 

2. 8080 포트로 들어오는 tcp 를 열어줘야 한다. 위 참고링크에 빠져있는 부분

- tag를 주고 원하는 VM에만 적용되게 할 수도 있지만 그냥 project 내의 모든 VM에 다 적용되도록 한다

- Create a firewall rule

Google Cloud Platform 
VPC network 
VPC networks 
External IP addresses 
Firewall rules 
Routes 
VPC network peering 
Shared vpc 
yapKaggle 
Create a firewall rule 
Firewall rules control incoming or outgoing traffic to an instance By default, 
incoming traffic from outside your network is blocked. Learn more 
Name 
allow-tcp-8080 
Description (Options') 
default 
0 
Priority 
Priority can be O - 65535 Check priority of other firewall rules 
1000 
Direction of traffic 
• In ress 
Egress 
Action on match 
• Allow 
Deny 
Targets 
All instances in the network 
Source filter 
IP ranges 
Source IP ranges 
0.0.0.0/0 0 
Second source filter 
None 
Protocols and ports 
Allow all 
• Specified protocols and ports 
tcp:8080 
Create 
Cancel

 

참고.

- tcp:8080-8900 으로 해주면 jupyter notebook 서버를 계속 실행해도 무리 없겠다.

- jupyter notebook --port로 지정한 포트가 이미 사용중이면 바로 다음 port 로 생성하기 때문

- jupyter notebook list

- 현재 동작하는 jupyter notebook server list가 쭈욱 나온다

list 
List 
s top 
S top 
ass w o Id 
currently 
currently 
running notebook servers . 
running notebook server for 
for the notebook server . 
a 
given port 
Set a password

- jupyter notebook을 실행한 ssh 창을 닫으면 jupyter notebook 역시 종료된다

- 막으려면 screen 을 실행하거나 tmux를 실행한다음 jupyter notebook을 실행하면 된다.

- 예를들어) screen -U -S jupyter

 

3. jupyter notebook 실행

- 옵션을 넣어준다. jupyter notebook --ip=0.0.0.0 --port=8080 --no-browser &

- 그러면 포트번호, 토큰이 들어간 url이 생성된다 (아래 참고)

Copy/paste this URL into your browser when you connect for the first time, 
to login with a token: 
http:/ /O . O . O . O :

- 그리고 Static External IP를 사용하여 브라우저에서 포트와 토큰을 포함하여 주소창에 넣고 실행하면 주피터 노트북이 실행된다

- 예를 들면) 104.196.240.74:8080/?token=f4d5838385232498eb91988950c6106b02f3bff35ed3ebf3

* --no-browser 옵션은 브라우저 실행하지 말라는 것

 

Jupyter notebook 맞게 predict.py → predict.ipynb 변경

* 다 똑같고, 마지막 빨간 네모만큼만 바꿔주면 된다

i moor t 
sys 
i moor t 
argoarse 
i moor t 
numoy 
from 
i moor t 
i moor t 
r eauests 
from 
i moor t 
Bytes10 
i moor t 
matolotlib. oyolot 
from 
keras. oreorocessl ng 
i moor t 
mage 
from 
keras. models 
i moor t 
oad_model 
from 
keras. apol i cat ions. incept ion_v3 
i moor t 
oreorocess_ nout 
target_size = 
*fixed size for InceptionL/3 architecture 
using TensorFIow backend. 
def predict (model , 
img, target_size): 
" " " Run model predict ion on image 
model: keras model 
img: PIL format image 
target_size: (w, h) tuple 
Returns: 
list of predicted labels and their probabi lities 
if 
= target_size: 
I mg. size 
img. resize(target_size) 
image. img) 
no. axi 
- oreorocess_inout (x) 
model . oredi ct (x) 
oreds = 
or eds C] 
return

 

def image, oreds): 
" " "Displays image and the too-n predicted probabi i ties in a bar graph 
oreds: list of predicted labels and their probabilities 
01 t. imshow( image) 
" dog" 
] , oreds, aloha= 
0.5 
olt.xlabel( 
show() 
= load_model( 
nceot onv3-ft model 
= Image. open( ./kaggl e-dogcat/test 1/1000. jog' 
oredi ct (model , 
img, target_size) 
oreds = 
img, oreds)

 

 

Microsoft OneNote 2016에서 작성